package bomberman.modelo.personajes;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;

import org.jdom2.Element;

import bomberman.modelo.armas.Arma;
import bomberman.modelo.armas.TiraMolotov;
import bomberman.modelo.items.Item;
import bomberman.modelo.mapa.Casillero;
import bomberman.modelo.mapa.Direccion;
import bomberman.modelo.observadores.Observadores;

public class Bombita extends Personaje {
  private static final int RESISTENCIA_STD  = 1;
  private static final int TEMPORIZADOR_STD = 0;
  private static final int VELOCIDAD_STD    = 1;
  private ArrayList<Item>  coleccionDeItems;
  private Queue<Direccion> movimientosARealizar;
  
  public Bombita(Casillero unCasillero) {
    super(new TiraMolotov(), Bombita.RESISTENCIA_STD, Bombita.TEMPORIZADOR_STD, unCasillero, Bombita.VELOCIDAD_STD);
    this.coleccionDeItems = new ArrayList<Item>();
    this.movimientosARealizar = new LinkedList<Direccion>();
  }
  
  public Casillero getUbicacion() {
	return super.getUbicacion();
  }
  
  public void setUbicacion(Casillero nuevaUbicacion) {
    super.setUbicacion(nuevaUbicacion);
  }
  
  public Direccion getDireccion() {
    return super.getDireccion();
  }
  
  public int getResistencia() {
    return super.getResistencia();
  }
  
  public void darArma(Arma unArma) {
    this.setArma(unArma);
  }
  
  public void aumentarTemporizador(int aumento) {
    if (aumento >= 0) {
      this.setTemporizador(this.getTemporizador() + aumento);
    }
  }
  
  public void reducirTemporizador(int reduccion) {
    if (reduccion >= 0) {
      if (this.getTemporizador() < reduccion) {
        this.setTemporizador(0);
      } else {
        this.setTemporizador(this.getTemporizador() - reduccion);
      }
    }
  }
  
  public void aumentarVelocidad(int aumento) {
    if (aumento >= 0) {
      this.setVelocidad(this.getVelocidad() + aumento);
    }
  }
  
  public void reducirVelocidad(int reduccion) {
    if (reduccion >= 0) {
      if (this.getVelocidad() < reduccion) {
        this.setVelocidad(0);
      } else {
        this.setVelocidad(this.getVelocidad() - reduccion);
      }
    }
  }
  
  public void agregarItem(Item nuevoItem) {
    int posicionAAgregar = this.coleccionDeItems.size();
    this.coleccionDeItems.add(posicionAAgregar, nuevoItem);
    Observadores.notificar(nuevoItem);
    nuevoItem.activar(this);
  }

  public void retirarItem(Item unItem) {
  		this.coleccionDeItems.remove(unItem);
  }
  
  public boolean contieneItem(Item item) {
    return this.coleccionDeItems.contains(item);
  }
  
  @Override
  protected void morir() {
    this.getUbicacion().setContenidoBajo(null);
  }
  
  @Override
  protected void mover(Casillero casilleroFinal) {
    if (casilleroFinal.esCaminablePor(this)) {
      if (casilleroFinal.getContenidoBajo() != null) {
        this.agregarItem((Item) casilleroFinal.getContenidoBajo());
      }
      casilleroFinal.setContenidoBajo(this);
      this.getUbicacion().setContenidoBajo(null);
      this.setUbicacion(casilleroFinal);
    }
  }
  
  public void mover(Direccion direccion) {
    this.movimientosARealizar.offer(direccion);
  }
  
  @Override
  public boolean puedeCaminarSobre(Item unItem) {
    return true;
  }
  
  public void revivir() {
    this.setResistencia(Bombita.RESISTENCIA_STD);
    this.coleccionDeItems= new ArrayList<Item>();
    this.darArma(new TiraMolotov());
  }
  
  @Override
  public void vivir() {
    for (int i = 0; i < this.getVelocidad(); i++) {
      if (!this.movimientosARealizar.isEmpty()) {
        switch (this.movimientosARealizar.poll()) {
          case NORTE:
            this.moverNorte();
          break;
          case SUR:
            this.moverSur();
          break;
          case OESTE:
            this.moverOeste();
          break;
          case ESTE:
            this.moverEste();
          break;
        }
        
        this.movimientosARealizar.clear();
      }
    }
  }
  
  @Override
  public Element serializar() {
    Element eBombita = new Element("Bombita");
    eBombita.setAttribute("Arma", String.valueOf(this.getArma().getClass().getName()));
    return (super.serializar(eBombita));
  }
  
  public static Bombita recuperar(Element nodoBombita, Casillero cas) {
	String arma = nodoBombita.getAttributeValue("Arma");
	int resistencia = Integer.parseInt(nodoBombita.getAttributeValue("Resistencia"));
	int velocidad = Integer.parseInt(nodoBombita.getAttributeValue("Velocidad"));
	int temporizador = Integer.parseInt(nodoBombita.getAttributeValue("Temporizador"));
	Direccion direccion = Direccion.valueOf(nodoBombita.getAttributeValue("Direccion"));

	Bombita nuevoBombita = new Bombita(cas);
	
	try {
		nuevoBombita.setArma((Arma) Class.forName(arma).newInstance());
	} catch (InstantiationException e) {
		e.printStackTrace();
	} catch (IllegalAccessException e) {
		e.printStackTrace();
	} catch (ClassNotFoundException e) {
		e.printStackTrace();
	}
	
	nuevoBombita.setResistencia(resistencia);
	nuevoBombita.setVelocidad(velocidad);
	nuevoBombita.setTemporizador(temporizador);
	nuevoBombita.setDireccion(direccion);
	    
	cas.setContenidoBajo(nuevoBombita);
	    
	return nuevoBombita;
  }
}
